/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2007 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or ( at your option ) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
aLONG with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
#pragma once

#include "../tinyxml/tinyxml.h"
#include "../ExtraServices.h"

namespace NExImport {

class CExImContactBase {
	BOOLEAN		compareUID( DBVARIANT *dbv );

protected:
	CHAR		*_strNick;		// utf8 encoded
	CHAR		*_strDisp;		// utf8 encoded
	CHAR		*_strGroup;		// utf8 encoded
	CHAR		*_strProto;
	CHAR		*_strAMPro;
	CHAR		*_strUIDKey;
	DBVARIANT	_dbvUID;
	HANDLE		_hContact;
	BOOLEAN		_isNewContact;	// is this contact a new one?

	HANDLE		findHandle();

public:
	CExImContactBase();
	~CExImContactBase();

	__inline LPCSTR disp() const	{ return mir_strcmp(_strDisp,"")? _strDisp : NULL;		}
	__inline LPCSTR group() const	{ return mir_strcmp(_strGroup,"")? _strGroup : NULL;	}
	__inline LPCSTR nick() const	{ return mir_strcmp(_strNick,"")? _strNick : NULL;		}
	__inline LPCSTR proto() const	{ return mir_strcmp(_strProto,"")? _strProto : NULL;	}
	__inline LPCSTR ampro() const	{ return mir_strcmp(_strAMPro,"")? _strAMPro : NULL;	}
	__inline LPCSTR uidk() const	{ return mir_strcmp(_strUIDKey,"")? _strUIDKey : NULL;	}
	__inline DBVARIANT& uid()		{ return _dbvUID;	}
	__inline HANDLE handle() const	{ return _hContact;	}
	
	__inline VOID	disp( LPCSTR val )		{ _strDisp		=  val ? val : ""; }
	__inline VOID	group( LPCSTR val )		{ _strGroup		=  val ? val : ""; }
	__inline VOID	nick( LPCSTR val )		{ _strNick		=  val ? val : ""; }
	__inline VOID	proto( LPCSTR val )		{ _strProto		=  val ? val : ""; }
	__inline VOID	ampro( LPCSTR val )		{ _strAMPro		=  val ? val : ""; }
	__inline VOID	uidk( LPCSTR val )		{ _strUIDKey	=  val ? val : ""; }
	__inline VOID	uid( BYTE val )			{ _dbvUID.type = DBVT_BYTE; _dbvUID.bVal = val; }
	__inline VOID	uid( WORD val )			{ _dbvUID.type = DBVT_WORD; _dbvUID.wVal = val; }
	__inline VOID	uid( DWORD val )		{ _dbvUID.type = DBVT_DWORD; _dbvUID.dVal = val; }
	__inline VOID	uidn( PBYTE val, DWORD len ) { _dbvUID.type = DBVT_BLOB; _dbvUID.pbVal= val; _dbvUID.cpbVal = (WORD)len; }
	__inline VOID	uida( LPCSTR val )		{ _dbvUID.type = ( _dbvUID.pszVal = mir_strdup( val ) ) ? DBVT_ASCIIZ : DBVT_DELETED; }
	__inline VOID	uidu( LPCSTR val )		{ _dbvUID.type = ( _dbvUID.pszVal = mir_strdup( val ) ) ? DBVT_UTF8 : DBVT_DELETED; }

	BOOLEAN			isHandle( HANDLE hContact );
	BOOLEAN			isMeta() const;

	LPSTR			uid2String( BOOLEAN bPrependType );

	BOOLEAN			fromDB( HANDLE hContact );
	BOOLEAN			fromIni( LPSTR& row );

	HANDLE			toDB();
	VOID			toIni( FILE* file, int modCount );

	BOOLEAN operator = ( HANDLE hContact )	{ return fromDB( hContact );	}
};

} // namespace NExImport
